package com.qf.ps;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeoutException;

public class ProducerMain {
    public static void main(String[] args) throws IOException, TimeoutException {
        //①创建一个连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //设置rabbitmq所在机器ip
        factory.setHost("localhost");
        //设置rabbitmq所在机器的程序端口号
        factory.setPort(5672);
        //设置用户名
        factory.setUsername("guest");
        //设置密码
        factory.setPassword("guest");
        //设置虚拟主机
        factory.setVirtualHost("cdm1");

        //② 利用连接工厂创建连接对象
        Connection conn = factory.newConnection();
        //③ 基于connection获取对应的channel通道对象
        Channel channel = conn.createChannel();

        //④ 发布消息（发送到交换机，由交换机分发与之绑定的队列中）
        /*
            p1：交换机的名字
            p2：交换机的类型。FANOUT类型（广播类型），表示将消息发送到与这个交换机绑定的所有队列上
         */
        channel.exchangeDeclare("psEx", BuiltinExchangeType.FANOUT);

        channel.queueDeclare("psQue1",true,false,false,null);
        channel.queueDeclare("psQue2",true,false,false,null);

        /*
            将队列和交换机实现绑定
                p1: 队列名称
                p2：交换机名称
                p3：路由键. 如果交换机类型是FANOUT类型，不需要路由键,使用 ""
         */
        channel.queueBind("psQue1","psEx","");
        channel.queueBind("psQue2","psEx","");

        channel.basicPublish("psEx","",null,"发布订阅消息模型".getBytes(StandardCharsets.UTF_8));

        //⑤ 释放资源
        channel.close();
        conn.close();
    }
}
